#include <iostream>
#include <iomanip>
#include <cmath>
#include <iomanip>
#include <string.h>
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
#include <arpa/inet.h>
using namespace std;

class CString
{
private:
     char * pStr; // 指向字符串的指针
     int len;    // 字符串的长度
public:
     CString();

     CString(const char *pStr);

     CString(const CString & str);
    

     CString(int size);  // 创建一个指定大小的空字符串
     

     char & operator[](int idx)//idx调用要填在【】里面
     {
        return pStr[idx];//这里根据函数的返回值，返回的是元素的引用（别名），也就是元素本身，而不是简单的返回元素的值
     }

     const char * getData()
     {
        return pStr;
     }

     int size()
     {
        return len;
     }

     CString operator+(const CString &str)
     {
        int newLen = len + str.len;
        char *pNewStr = new char[newLen + 1]; // 创建新的可以容纳两个字符串的空间
        // 把连个字符串拷贝到新空间中
        strcpy(pNewStr, pStr);
        strcat(pNewStr, str.pStr);
        CString newStr = pNewStr; // 构建一个新的字符串返回
        return newStr;
     }

     void operator+=(const CString &str)
     {
        //把自己的长度和对方的长度相加，算出新的长度
        int newLen = len + str.len;
        // 根据新的长度创建出新的能够容纳两个字符串的空间
        char *pNewStr = new char[newLen + 1]; // 创建新的可以容纳两个字符串的空间
        // 把两个个字符串拷贝到新空间中
        strcpy(pNewStr, pStr);
        strcat(pNewStr, str.pStr);

        if(len>0)//如果自己的长度大于0，说明自己原来有空间
        {
            delete []pStr;//释放掉字符串原来的空间
        }
        pStr = pNewStr;//让自己的指针指向新的空间
        len = newLen;//更新自己的长度
     }

     void operator+=(const char * str)
     {
        //把自己的长度和对方的长度相加，算出新的长度
        int newLen = len + strlen(str);
        // 根据新的长度创建出新的能够容纳两个字符串的空间
        char *pNewStr = new char[newLen + 1]; // 创建新的可以容纳两个字符串的空间
        // 把两个个字符串拷贝到新空间中
        strcpy(pNewStr, pStr);
        strcat(pNewStr, str);

        if(len>0)//如果自己的长度大于0，说明自己原来有空间
        {
            delete []pStr;//释放掉字符串原来的空间
        }
        pStr = pNewStr;//让自己的指针指向新的空间
        len = newLen;//更新自己的长度
     }

     bool operator==(const CString &str)
     {
        if(len == str.len)//先判断长度是否相等
        {
            if(strcmp(pStr,str.pStr)==0)//再判断内容是否相等
            {
                return true;
            }
        }
        return false;
     }

     void operator=(const CString &str)//等于号
     {
        if(len > 0)
        {
            delete []pStr;//释放掉自己空间
        }
        this->len = str.len;//把传入的字符串的长度赋值给当前调用dengyu函数的对象的长度
        pStr = new char[len+1];//根据对方的长度，自己也创建一个同样大小的空间内容为空
        strcpy(pStr ,str.pStr);//把对方的内容拷贝到自己的空间中
    }


    ~CString()
    {
        if(len>0)
        {
            cout<<"我的内容是："<<pStr<<"，我现在马上要消失了，所以在析构函数中我要释放掉它"<<endl;
            delete [] pStr;
        }
    }
};

    ostream & operator<<(ostream &out,CString &str)
    {
    out<<str.getData();
    return out;
    }


